OpenAIからChatGPTとWhisperに関するAPIがリリースされたのでドキュメントを読み解いてみた
こんちには。
データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。
先日、OpenAIからChatGPTとWhisperに関するAPIがリリースされました。
この記事では発表やAPIドキュメントからポイントとなりそうな部分を抽出して紹介したいと思います。
1次情報は以下を参照ください。
冒頭まとめ
冒頭で気付いたポイントを列挙しておきます。
- ChatGPT API
- 入力としてテキスト(
content
)以外にrole
をmessages
に記述(複数可能) - 入力に
role
を用いた複数のmessage
を与えることで、ある程度内容のコントロールが可能 - 会話の履歴は自動では参照しないため、サービスとしてのChatGPTと同様の動きをさせるには、過去の会話を入力する必要があると推察
- 課金は入力出力合計のトークン単位($0.002/1ktoken)
- トークンは単純な単語単位とは異なる。また入力トークンも課金に含む
- 入力と出力は合計で4096トークンまでしか対応できない
- 入力トークン数を見積もるためのツールは提供されており、出力トークン数はパラメータ側で制御可能
- Dedicated インスタンスも存在するが利用数が多いユーザ向け
- 入力としてテキスト(
- Whisper API
- トランスクリプション(書き起こし)とトランスレーション(翻訳)は別のエンドポイント
- 入力は25MBまでのため、長さによっては音声のみ、圧縮フォーマットを使用するなどの工夫が必要
- 課金はファイルサイズではなく、時間長で決まる($0.006/分、1時間の会議で約50円程度)
- それでも難しい場合は、Pydubなどの別ライブラリで区間切り出しを検討する必要あり
- Whisperにも
prompt
があり、句読点の有無やフィラーの有無を制御できる用途が想定 - タイムスタンプなどの詳細出力するためには、response_formatをverbose_jsonにする必要がある
- その他
- Fine-tuningについては双方未対応
- データ利用ポリシーの更新
それでは、ChatGPT、Whisperの順に見ていきます。
ChatGPT API
エンドポイント
以下がAPIのエンドポイントとなります。
https://api.openai.com/v1/chat/completions
もともとテキスト生成用に以下のcompletionsエンドポイントがありましたが、それとは微妙に違うためご注意ください。
https://api.openai.com/v1/completions
リクエスト例
HTTPリクエストの例は以下です。テキスト生成ではprompt
でしたが、その代わりにmessages
という形で入力を与えます。
(以降、OPENAI_API_KEY
という環境変数にAPIキーを設定している前提です)
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "What is the OpenAI mission?"}] }'
messages
には以下のように複数のテキストを含めることができます。
curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "What is the OpenAI mission?"},{"role": "user", "content": "Who won the world series in 2020?"},{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},{"role": "user", "content": "Where was it played?"}] }'
role
には、system
, user
, assistant
のいずれかを指定することが可能で、これにより以下を可能としています。
- アシスタントの行動をある程度設定する
- 会話履歴を含めることで、過去の履歴を含めたニュアンスで回答する
ChatGPTをWebブラウザから使用していた時は、会話履歴を把握しながら回答してくれていました。
当然ですが、APIとして使用する時は組み込む開発者側で過去の会話履歴を管理する必要がありそうです。
またリクエストについては、PythonとNode.jsなどでライブラリが提供されているため、そちらで実行することも可能です。
ライブラリについての詳細は以下を参照ください。
レスポンス例
レスポンスは以下のように返されます。
{ "id": "chatcmpl-6p5FEv1JHictSSnDZsGU4KvbuBsbu", "object": "messages", "created": 1677693600, "model": "gpt-3.5-turbo", "choices": [ { "index": 0, "finish_reason": "stop", "messages": [ { "role": "assistant", "content": "OpenAI's mission is to ensure that artificial general intelligence benefits all of humanity." } ] } ], "usage": { "prompt_tokens": 20, "completion_tokens": 18, "total_tokens": 38 } }
prompt_tokens
が入力トークン数であり、completion_tokens
が出力トークン数です。
これらが請求額のもとになります。
トークンとは何か
ここでトークンとは何かについて見ていきます。
ChatGPTを利用するにあたっては、多少はトークンというものを意識する必要があります。その理由は以下です。
- 課金はトークン単位で実施される
- トークンの総数がモデルの最大値以下でなければならない
- 例えば、
gpt-3.5-turbo-0301
モデルでは4096トークン
- 例えば、
トークンは単純な単語単位等ではなく、例えば以下のようにトークン分割されます。
"ChatGPT is great!"
["Chat", "G", "PT", " is", " great", "!"]
また入力トークンと出力トークンの両方が、これらの数量にカウントされます。
動作の具体例としては以下のようになります。
- 入力に10トークンを使用し、メッセージ出力で20トークンを受け取った場合、30トークンが請求される
- 入力に4090トークンを使用した場合、出力は6トークンで打ち切られる
これらのトークン(入力側)がどの程度の数になるかをAPIコール前に知りたい場合は、公式ドキュメントに記載の通り以下のNotebookのコードが参考になりそうです。
出力側のトークンは、リクエストにmax_tokens
を含めることで制限できます。
詳細は以下も参照ください。
トークンの上限についての情報から、ChatGPTをブラウザで使用する場合にRegenerate
をできていたのは、ある程度入力の過去履歴を打ち切っていたということが推察されます。
ですので開発者自身で組み込む場合はここも考慮事項になりそうですね。
モデルについて
現在は、gpt-3.5-turbo
とgpt-3.5-turbo-0301
が指定可能です。
gpt-3.5-turbo-0301
はgpt-3.5-turbo
のスナップショットとなっており、gpt-3.5-turbo
を指定すれば最新版を追従して使える形となります。
逆にモデルを固定化したい場合は、gpt-3.5-turbo-0301
のように指定すればOKなようです。
またトレーニングデータについては2021年9月までの情報となっているため、最新の情報を参照できない可能性がある点は課題として残っています。
ここは今後のアップデートに大いに期待ですね。以下からモデル一覧を確認できますので、気になる方はウォッチしておきましょう。
出力のランダム性の制御
出力のランダム性を制御するためのパラメータとしてtemperature
とtop_p
があります。
双方とも高く設定すると出力がだんだんランダムとなる仕組みです。
両方を同時に設定することは推奨されていないようです。
APIパラメータの詳細
その他にもいくつかパラメータがありますので、以下もご参照ください。
料金
トークンの合計量で決まります。現在は1,000トークンあたり$0.002となっているようです。
以下の公式情報もご参照ください。
Dedicated インスタンス
ChatGPTは通常はユーザ間でインスタンスが共有されて処理されますが、Dedicated インスタンス(専用インスタンス)も提供されるようです。
発表によれば、Dedicated インスタンスは料金体系も異なり、計算インフラストラクチャの割り当てを期間ごとに支払う形となるようです。
また様々なオプションの設定も可能となっており、例えば以下のようなものも挙げられています。
- 長いコンテキスト制限などの機能を有効にするオプション
- モデルスナップショットを固定する機能
目安としては、1日あたり4億5000万トークンを超えて稼働する場合に、経済的なメリットが出てくるようです。
さらに、開発者のワークロードをハードウェアのパフォーマンスに対して直接最適化することができるため、共有インフラストラクチャと比較してコストを劇的に削減することができるようですね。
こちらのDedicated インスタンスに関しての詳細は、別途個別にOpenAIまで問い合わせる必要があります。
Whisper API
Whisper APIは、トランスクリプション(音声を文字に書き起こす)とトランスレーション(+英語への翻訳)をエンドポイントから利用可能となっています。
エンドポイント
以下がAPIのエンドポイントとなります。
https://api.openai.com/v1/audio/transcriptions
リクエスト例
以下がリクエスト例となります。(トランスクリプションの場合)
curl https://api.openai.com/v1/audio/transcriptions \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: multipart/form-data" \ -F model="whisper-1" \ -F file="@/path/to/file/openai.mp3"
また翻訳の場合は以下になります。
curl https://api.openai.com/v1/audio/translations \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -H "Content-Type: multipart/form-data" \ -F model="whisper-1" \ -F file="@/path/to/file/openai.mp3"
レスポンス例
レスポンス例は以下のようになります。
{ "text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger..." }
デフォルトではタイムスタンプなどの詳細が出力されないため、詳細を見たい場合はresponse_formatをverbose_jsonにする必要があります。
対応フォーマット
以下の入力ファイルタイプに対応しています。
- MP3、MP4、MPEG、MPGA、M4A、WAV、WebM
また現在、ファイルのアップロードは25MBに制限されています。
そのため25MB以上のデータを処理したい場合は、圧縮フォーマットを使用するかPydubなどのライブラリを使って音声を分割する必要がありそうです。
(Pydub自体はとても便利で、無音判定を自動で実施して分割するなどが可能です。今後情報をブログで紹介したいと思います)
プロンプト
Whisperにおいてもprompt
パラメータを使用することで、出力されるテキストに影響を与えることができるようです。
以下のようなシーンが想定されています。
- 分割されてしまった音声の前のセグメントの書き起こし結果をプロンプトに含めて精度を向上させる
- 書き起こし結果は句読点がスキップされることが多いため、プロンプトに句読点を含めることで、句読点を出力させる
- 「えー…」などのフィラーも同様にスキップされることが多いため、プロンプトにフィラーを含めることで、フィラーも出力させる
ここら辺が制御できるのはとても便利そうですね。
言語の指定
Whisper自体は言語を自動で判定することが可能ですが、language
パラメータを指定することでこれを手動で指定することも可能です。(transcriptionsのみ)
language
はISO-639-1の言語コードで指定します。
詳細は下記を参照ください。
モデル
モデルには現在whisper-1
のみが指定可能となっており、この指定でWhisperのlarge-v2が使用されます。
(whisper-l
ではないかと最初おもいましたがwhisper-1
でOKです)
Whisper large-v2についてはリポジトリを参照ください。
出力のランダム性の制御
出力のランダム性を制御するためのパラメータとしてtemperature
があります。
こちらはChatGPTと同様、高く設定すると出力がだんだんランダムとなる仕組みです。
APIパラメータの詳細
その他のパラメータについては、以下をご参照ください。
料金
入力音声データの時間長あたりで決まります。現在は1分あたり$0.006となっているようです。
会議1時間あたり、$0.36ですので現在のレートでは50円程度となります。
以下の公式情報もご参照ください。
Pythonでの実行例
ここまではAPI仕様について説明してきましたが、最後にPythonライブラリで実行する方法を記載しておきます。
まずはpipでopenaiをインストールします。
pip install openai
APIキーはOPENAI_API_KEY
という環境変数に設定しておけば動作させることができます。
ChatGPTを使用する際は以下のような形です。
completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Tell the world about the ChatGPT API in the style of a pirate."}] ) print(completion)
Whiperを使用する場合は以下となります。
import openai file = open("/path/to/file/openai.mp3", "rb") transcription = openai.Audio.transcribe("whisper-1", f) print(transcription)
その他
Fine-tuningについて
現在、OpenAIのAPIでFine-tuningできるのはGPT-3系のみとなっており、ChatGPTのgpt-3.5-turbo
とWhisperについては提供されていないようです。
ここは今後の動きにも期待したいと思います。
データ利用に関するポリシー
APIで送信するデータについて、どのように利用されるかのポリシーについても併せて3/1に更新されていますのでご参照ください。
まとめ
いかがでしたでしょうか。
API仕様を細かく見ていくと、単純にレスポンスを得るだけでなく意図通りの出力を得るための調整どころについても理解することができました。
またChatGPTをWebブラウザから使用していただけでは分からない制限なども明らかになりました。
これにより組み込み時に必要そうな考慮事項を把握できたのは良かったと思います。
今後APIをお使いになられる方の参考になれば幸いです。